#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //引入bool类型

#define MaxSize 10

/*
顺序表：
用顺序存储的方式实现线性表

*/

struct SqlList
{
    int data[MaxSize]; // 用静态数组存储数据元素
    int length;        // 顺序表当前长度
};

// 初始化一个顺序表

void InitList(struct SqlList *L)
{
    for (int i = 0; i < MaxSize; i++)
    {
        L->data[i] = 0;
    }
    L->length = 0;
}
//插入操作  在第i个位置插入e
bool ListInsert(struct SqlList *L, int i, int e)
{
    if (i < 1 || i > L->length + 1)
    {
        return false;
    }
    if (L->length >= MaxSize)
    {
        return false;
    }

    for (int j = L->length; j >= i; j--)
    {
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e;
    L->length++;
    return true;
}

void print(struct SqlList L)
{
    for (int i = 0; i < MaxSize; i++)
    {
        printf("%d\t", L.data[i]);
    }
    printf("\n");
}

// 删除第i个元素，并将删除的元素传递给e
bool ListDelete(struct SqlList *L, int i, int *e)
{
    if (i < 1 || i > L->length)
    {
        return false;
    }
    *e = L->data[i - 1];
    for (int j = i; j < L->length; j++)
    {
        L->data[j - 1] = L->data[j];
    }
    L->length--;
    return true;
}

//按位查找
int GetElem(struct SqlList *L, int i)
{
    return L->data[i - 1];
}

//按值查找
int LocateElem(struct SqlList *L, int e)
{
    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == e)
        {
            return i + 1;
        }
    }
    return 0;
}

//**************************************************************************************************************
//动态分配实现顺序表

struct SqlList2
{
    int *data;  // 用动态分配数组的指针
    int MaxLen; // 顺序表的最大容量
    int length; // 顺序表当前长度
};

void InitList2(struct SqlList2 *L)
{
    L->data = (int *)malloc(MaxSize * sizeof(int));
    L->length = 0;
    L->MaxLen = MaxSize;
}

//增加动态数组的长度  扩展len长度
void IncreaseSize(struct SqlList2 *L, int len)
{
    int *p = L->data;
    L->data = (int *)malloc((L->MaxLen + len) * sizeof(int));
    for (int i = 0; i < L->length; i++)
    {
        L->data[i] = p[i];
    }
    L->MaxLen = L->MaxLen + len;
    free(p); //释放原来的内存空间
}

int main()
{
    printf("\n\n========================================================================\n\n");
    struct SqlList list;
    // InitList2(&list);
    // printf("MaxLen:%d\n",list.MaxLen);
    // printf("length:%d\n",list.length);
    // IncreaseSize(&list,5);
    // printf("MaxLen:%d\n",list.MaxLen);
    // printf("length:%d\n",list.length);
    InitList(&list);
    bool flag = ListInsert(&list, 1, 3);
    ListInsert(&list, 2, 4);
    print(list);
    int e = -1;
    ListDelete(&list, 1, &e);
    print(list);
    printf("e===%d\n", e);

    printf("\n\n========================================================================\n\n");
    return 0;
}